import xlrd
import os
# import exception_test
from datetime import datetime, date


def file_read(filename="test.xls"):
    if os.path.exists(filename):
        data = xlrd.open_workbook(filename)
        sheet_names = data.sheet_names()  # 获取所有sheet名称
        print(sheet_names)

        # 根据下标获取sheet名称
        sheet1_name = sheet_names[0]
        print(sheet1_name)

        # 根据sheet索引或者名称获取sheet内容，同时获取sheet名称、列数、行数
        sheet1 = data.sheet_by_index(0)
        print('sheet2名称:{}\nsheet2列数: {}\nsheet2行数: {}'.format(sheet1.name, sheet1.ncols, sheet1.nrows))

        # 根据sheet名称获取整行和整列的值
        sheet1_2 = data.sheet_by_name("学生")
        # 指定整行值-数组
        print(sheet1_2.row_values(3))
        # 指定整列值-数组
        print(sheet1_2.col_values(3))
        # 获取指定单元格的内容 # 第2 行1列内容
        print(sheet1.cell(1, 0).value)
        print(sheet1.cell_value(1, 0))
        print(sheet1.row(1)[0].value)
        print(sheet1.row(1)[2].value)

        # 获取单元格内容的数据类型
        print(sheet1.cell(1, 0).ctype)
        print(sheet1.cell(3, 3).ctype)
        print(sheet1.cell(6, 1).ctype)
        print(sheet1.cell(1, 6).ctype)
        print(sheet1.cell(1, 7).ctype)
        print(sheet1.cell(1, 8).ctype)
        # 说明 ctype : 0 empty, 1 string, 2 number, 3 date, 4 boolean, 5 error

        # 使用xlrd的xldate_as_tuple处理为date格式
        row, col = 1, 7
        if sheet1.cell(row, col).ctype == 3:
            v = sheet1.cell(row, col).value
            print(v)
            data_value = xlrd.xldate_as_tuple(v, data.datemode)
            print(data_value)
            print(date(*data_value[:3]))  # 2022-10-13
            print(date(*data_value[:3]).strftime("%Y/%m/%d"))  # 2022/10/13

        # 获取合并单元格内容
        # 这里，需要在读取文件的时候添加个参数，将formatting_info参数设置为True，默认是False，否
        # 则可能调用merged_cells属性获取到的是空值。
        data = xlrd.open_workbook(filename, formatting_info=True)
        sheet1 = data.sheet_by_name("学生")
        print(sheet1.merged_cells)
        # merged_cells返回的这四个参数的含义是：(row,row_range,col,col_range),其中[row,row_range)包括row,
        # 不包括row_range,col也是一样，下标从0开始。
        # (3, 5, 3, 4) 表示列[3,4)的[3,5)行合并,即第3列，3和4行合并
        # 获取合并个单元格的内容：
        print(sheet1.cell(4, 3).value)

        # 更加方便的方式来获取合并单元格内容
        merge_value = []
        for (row,row_range,col,col_range) in sheet1.merged_cells:
            merge_value.append((row, col))
        print(merge_value)
        for v in merge_value:
            print(sheet1.cell(v[0], v[1]).value)
if __name__ == '__main__':
    file_read()
    # file_read("example.xls")
